Kotlin 在 1.5 發表了 value classes。在 Kotlin 已經有 typealias , data class 的情況下為什麼還需要 value class 呢。
用 Class 可以解決兩個問題,1. 讓你的 Type 有意義 2. 確保 type-safety。而原始型別也是有 type safe 的保證,但無法保證他的意義,例如溫度的華式(℃)跟攝式(℉)都是 Double
所以在這之前 Kotlin 有幾種解法,一個是 type alias, 但是這個就真的只是別名,並不能的在 compiler time 保證。
typealias TemperatureC = Double
typealias TemperatureF = Double
fun isTheTemperatureHot(temperatureC: TemperatureC) { ... }
fun callingFunction() {
val tempF: TemperatureF = 100
isTheTemperatureHot(weight)
}
是還是真的有這麼嚴重,歷史上有一台火星氣候探測者號,在降落時失敗,最後 root cause 是單位錯誤,因為火星氣候探測者號上的飛行系統使用公制單位牛頓計算推進器動力,而地面人員輸入的方向校正量和推進器參數則使用英制單位磅力,所以就 GG 惹
所以如果我們有 value class, 在不同的 value class 即使同是 double 也不能直接拿來用。
@JvmInline
value class TemperatureC(val value: Double)
fun isTheTemperatureHot(temperatureC: TemperatureC) { ... }
fun callingFunction() {
val tempF: TemperatureF(100)
isTheTemperatureHot(tempF) // not compileed
}
Value Class 提高了程式碼的可讀性及型別保證,並且在 compile 時,Kotlin 會還原成原始型別。所以效率是很高的。